/*
 * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
 * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 */
package java.lang;

import java.util.Iterator;
import java.util.Objects;
import java.util.Spliterator;
import java.util.Spliterators;
import java.util.function.Consumer;

/**
 * 实现这个接口允许一个对象成为for-each循环语句的目标 <p/>
 *
 * Iterable 是 Java 中的一个顶级接口，位于 java.lang 包中。
 * 它是为了统一“可迭代对象”的概念而设计的，
 * 表示实现该接口的类可以提供一个迭代器 (Iterator) 来逐个访问其内部的元素 <p/>
 *
 * @author chuming
 * @create 2021/12/29 - 21:57
 *
 */
public interface Iterable<T> {

    // 返回一个内部元素为T类型的迭代器（JDK1.5只有这个接口）
    // 获取一个迭代器
    Iterator<T> iterator();


    // 遍历内部元素，action意思为动作，指可以对每个元素进行操作（JDK1.8添加）
    // 增强for语句
    default void forEach(Consumer<? super T> action) {
        Objects.requireNonNull(action);
        for (T t : this) {
            action.accept(t);
        }
    }


    // 创建并返回一个可分割迭代器（JDK1.8添加），分割的迭代器主要是提供可以并行遍历元素的迭代器，可以适应现在cpu多核的能力，加快速度。
    //（划重点：并行遍历元素 并行！）
    default Spliterator<T> spliterator() {
        return Spliterators.spliteratorUnknownSize(iterator(), 0);
    }
}
